function explicit_error

%  Generates the data for plotting error at t=tmax when using explicit method
%    (a) for fixed N, and
%    (b) for fixed lambda
%  for the heat equation problem
%       diff(u,x,x) = diff(u,t)   for xL < x < xr, 0 < t < tmax
%  where
%      u = 0  at x=xL,xR  and  u = sin(2*pi*x) at t = 0

% clear all previous variables and plots
clear *
clf

% set parameters
tmax=0.1;
xL=0;
xR=1;

%%%%%%   fixed N   %%%%%%%%%%%%%

N=20;

% generate the points along the x-axis, x(1)=xL and x(N+2)=xR
x=linspace(xL,xR,N+2);
h=x(2)-x(1);

ii=0;
Mmax=3;
Mmin=1;
Nm=22;
dm=(Mmax-Mmin)/(Nm-1);
for i=1:Nm
	M=round(8.5*10^(Mmin+(i-1)*dm))-1;
	ii=ii+1; points(ii)=M+1;
	t=linspace(0,tmax,M+1);
	k=t(2)-t(1);
	lamda=k/h^2;
	error(ii)=explicit2(x,N+2,M+1,tmax,lamda);
end;	

N=40;

% generate the points along the x-axis, x(1)=xL and x(N+2)=xR
x=linspace(xL,xR,N+2);
h=x(2)-x(1);

ii=0; 
Mmax=4;
Mmin=2;
Nm=22;
dm=(Mmax-Mmin)/(Nm-1);
for i=1:Nm
	M=round(3.5*10^(Mmin+(i-1)*dm))-1;
	ii=ii+1; points2(ii)=M+1;
	t=linspace(0,tmax,M+1);
	k=t(2)-t(1);
	lamda=k/h^2;
	error2(ii)=explicit2(x,N+2,M+1,tmax,lamda);
end;	

% plot results
% get(gcf)
%set(gcf,'Position', [1235 552 615 415]);
plotsize(615,415)

subplot(2,1,2)
loglog(points,error,'-sr','MarkerSize',7)
hold on
loglog(points2,error2,'-ob','MarkerSize',7)
legend(' N = 20',' N = 40',3);

% axes used in plot
xlabel('Number of Time Points','FontSize',14,'FontWeight','bold')
ylabel('Error','FontSize',14,'FontWeight','bold')

% have MATLAB use certain plot options (all are optional)
grid on
set(gca,'MinorGridLineStyle','none')
set(gca,'ytick',[1e-6 1e-5 1e-4 1e-3 1e-2]);
set(findobj(gcf,'tag','legend'),'FontSize',14,'FontWeight','bold');
set(gca,'FontSize',14)
hold off

%%%%%%   fixed lambda  %%%%%%%%%%%%%

N=18;
M=73;
ii=0;
for i=1:5
	ii=ii+1; points3(ii)=M;
	x=linspace(xL,xR,N+2);
	h=x(2)-x(1);
	t=linspace(0,tmax,M+1);
	k=t(2)-t(1);
	lamda=k/h^2;
	error3(ii)=explicit2(x,N+2,M+1,tmax,lamda);
	N=2*N+1;
	M=4*M;
end;	

N=18;
M=147;
ii=0;
for i=1:5
	ii=ii+1; points4(ii)=M;
	x=linspace(xL,xR,N+2);
	h=x(2)-x(1);
	t=linspace(0,tmax,M+1);
	k=t(2)-t(1);
	lamda=k/h^2;
	error4(ii)=explicit2(x,N+2,M+1,tmax,lamda);
	N=2*N+1;
	M=4*M;
end;	

% plot results
subplot(2,1,1)
loglog(points3,error3,'-sr','MarkerSize',7)
hold on
loglog(points4,error4,'-ob','MarkerSize',7)
legend(' \lambda = 0.490',' \lambda = 0.245',3);

% axes used in plot
xlabel('Number of Time Points','FontSize',14,'FontWeight','bold')
ylabel('Error','FontSize',14,'FontWeight','bold')

% have MATLAB use certain plot options (all are optional)
set(gca,'ytick',[1e-6 1e-5 1e-4 1e-3 1e-2]);
set(findobj(gcf,'tag','legend'),'FontSize',14,'FontWeight','bold');
grid on
set(gca,'MinorGridLineStyle','none')
set(gca,'FontSize',14)
hold off
say=['Explicit Method: error when u(x,0)=sin(2\pix)'];
title(say,'FontSize',14,'FontWeight','bold')


% explicit method
function q=explicit2(x,N,M,tmax,lamda)
UE=zeros(N,M);
for i=1:N
	UE(i,1)=g(x(i));
	exact(i)=exp(-4*pi*pi*tmax)*sin(2*pi*x(i));
end;
for j=2:M
	for i=2:N-1
	  UE(i,j)=lamda*UE(i+1,j-1)+(1-2*lamda)*UE(i,j-1)+lamda*UE(i-1,j-1);
	end;
end;
q=norm(UE(:,M)-exact',inf);

% subfunction g(x) '
function q=g(x)
q=sin(2*pi*x);

% subfunction plotsize
function plotsize(width,height)
siz=get(0,'ScreenSize');
bottom=max(siz(4)-height-95,1);
set(gcf,'Position', [2 bottom width height]);